package spring_learn.a08;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import spring_learn.a08.scope_resolve.Bean1;


/*
    不同scope对bean的影响
    singleton   prototype     request           session          application
    单例          每次产生新的   同一个request      同一个session



    1. 单例注入其它 scope 的四种解决方法
   * @Lazy
   * @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
   * ObjectFactory
   * ApplicationContext
    2. 解决方法虽然不同，但理念上殊途同归: 都是推迟其它 scope bean 的获取

 */
@SpringBootApplication
public class A08 {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(A08.class);
        Bean1 bean1 = run.getBean(Bean1.class);
        //对于单例对象中自动注入一个非单例对象的情况下，如果这个对象不加任何处理，那么每次获取到的对象都是一样的，违背了之前的设定，例如这里的bean2
        System.out.println(bean1.getBean2());
        System.out.println(bean1.getBean3());
        System.out.println(bean1.getBean4());
        System.out.println(bean1.getBean2());
        //bean3在scope的属性中加入proxyMode = ScopedProxyMode.TARGET_CLASS解决
        System.out.println(bean1.getBean3());
        //bean4通过lazy注解解决
        System.out.println(bean1.getBean4());
        //还可以通过在单例对象中直接通过applicaitonContxt获取对象/使用ObjectFactory进行解决
    }
}
